#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=1e5+10;

int f[N],cnt[N],ct[N],area[N],minId[N];
int vis[N];

int Find(int x)
{
	if(f[x]!=x)
	{
		f[x]=Find(f[x]);
	}
	return f[x];
}
void Union(int x,int y)
{
	x=Find(x);
	y=Find(y);
	if(x==y)
		return;
	minId[y]=min(minId[x],minId[y]);
	f[x]=y;
}
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<N;i++)
	{
		f[i]=i;
		minId[i]=i;
	}
	vector<int> ret;
	for(int i=1;i<=n;i++)
	{
		int id,fid,mid,k;
		cin>>id>>fid>>mid>>k;
		if(fid!=-1)
		{
			vis[fid]=1;
			Union(id,fid);
		}
		if(mid!=-1)
		{
			vis[mid]=1;
			Union(id,mid);
		}
		vis[id]=1;
		while(k--)
		{
			int son;
			cin>>son;

			vis[son]=1;
			Union(son,id);
		}
		
		int t1,t2;
		cin>>t1>>t2;
		ct[id]+=t1;
		area[id]+=t2;	
		
	}
	
	
	for(int i=0;i<N;i++)
	{
		if(vis[i])
		{
			int u=Find(i);
			cnt[u]++;
			if(u==i)
			{
				ret.push_back(i);
				continue;
			}
			area[u]+=area[i];
			ct[u]+=ct[i];
			
		}
	}
	
	sort(ret.begin(),ret.end(),[&](const int& p1,const int& p2)
	{
		if(1.0*area[p1]/cnt[p1]==1.0*area[p2]/cnt[p2])
			return minId[p1]<minId[p2];
		return (1.0*area[p1]/cnt[p1])>(1.0*area[p2]/cnt[p2]);

	});
	cout<<ret.size()<<endl;
	for(int i=0;i<ret.size();i++)
	{
		int t=ret[i];
		printf("%04d %d %.3lf %.3lf\n",minId[t],cnt[t],1.0*ct[t]/cnt[t],1.0*area[t]/cnt[t]);
	}
	
	return 0;
}
